/* **************************************************************** */
/* Authors:     Jasper Henne, Shana Van Dessel & Cedric Wens        */
/* Document:    Robot.h                                             */
/* Description: Verbinden met en aansturen van robot                */
/* **************************************************************** */

#ifndef ROBOT_H
#define ROBOT_H

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <csignal>
#include <signal.h>
#include <termios.h>
#include <fcntl.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <unistd.h>

#define     DRAAIFACTOR 38  // aantal miliseconden draaien om 1 graad te draaien
#define     RIJFACTOR   15   // aantal miliseconden draaien om een afstand van x af te leggen //!
#define     RIJFACTORTRAAG   20   // aantal miliseconden draaien om een afstand van x af te leggen //!
#define     SNEL        100 // snelheid robot
#define     TRAAG       10  // snelheid robot (10 keer trager)

using namespace std;

class Robot
{
    private:
        int xpos;                               // x-coordinaat robot
        int ypos;                               // y-coordinaat robot
        int angle;                              // hoek robot

        int distance;                           // afstand tot doel
        int rotation;                           // relatieve hoek tov doel

        bool caught ;                           // grijper open (false) of dicht (true)
        int fd;                                 // filedescriptor voor communicatie

    public:
        /* Connectie robot */
        int connect();                          // verbinding opzetten
        void disconnect();                      // verbinding afbreken
        //void stoppen(int signo);

        /* Motorfuncties e.d. */
        void command(char x[]);					// commando doorsturen
        void wheels(int speedl, int speedr);	// wielen aansturen
        void claw(bool close);                   // grijper aansturen
        int sensor();							// afstandssensor

        /* Functies */
        void drive(int speed, int tijd);        // rechtdoor rijden
        void rotateRight(int tijd);             // draaien naar rechts
        void rotateLeft(int tijd);              // draaien naar links

        void catchCan();                        // grijper sluiten
        void releaseCan();                      // grijper openen

        void whereTo(int distance, int angle);  // distance en rotation wijzigen adhv nieuwe gegevens
        void moveIt(bool dichtbij);             // draaien over hoek (rotation) en rijden tot aan doel (distance)

        /* Getters en setters */
        int getXPos();
        void setXPos(int xpos);
        int getYPos();
        void setYPos(int ypos);
        int getAngle();
        void setAngle(int angle);
        void setDistance(int dist);
        int getDistance();
        void setRotation(int ang);
        int getRotation();
        void setCaught(bool grip);
        bool getCaught();

    protected:
};

#endif // ROBOT_H
